package imai78gae.heya.action;

import imai78gae.heya.exception.ResourcesAlreadyExistException;
import imai78gae.heya.guice.HeyaModule;
import imai78gae.heya.model.UserInfo;
import imai78gae.heya.service.AccountService;

import org.seasar.cubby.action.Accept;
import org.seasar.cubby.action.ActionClass;
import org.seasar.cubby.action.ActionResult;
import org.seasar.cubby.action.FlashMap;
import org.seasar.cubby.action.Forward;
import org.seasar.cubby.action.Path;
import org.seasar.cubby.action.Redirect;
import org.seasar.cubby.action.RequestMethod;
import org.seasar.cubby.action.RequestParameter;
import org.seasar.cubby.action.Validation;
import org.seasar.cubby.validator.DefaultValidationRules;
import org.seasar.cubby.validator.ValidationRules;
import org.seasar.cubby.validator.validators.MaxLengthValidator;
import org.seasar.cubby.validator.validators.RegexpValidator;
import org.seasar.cubby.validator.validators.RequiredValidator;

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.servlet.RequestScoped;

/**
 * アカウントを新たに登録する為の画面の為のアクション・クラスです。
 * 
 * @author imai78
 *
 */
@RequestScoped
@ActionClass
@Path("newaccount")
public class NewAccountAction {

	/**
	 * 新規アカウント登録画面に対する入力検査仕様です。
	 */
	ValidationRules validation = new DefaultValidationRules() {
		@Override
		public void initialize() {
			// ログインID
			super.add("uid", new RequiredValidator(),
					new MaxLengthValidator(20),
					new RegexpValidator("[0-9a-zA-Z]+"));
			// パスワード
			super.add("upw", new RequiredValidator(),
					new MaxLengthValidator(20),
					new RegexpValidator("[0-9a-zA-Z]+"));
			// 確認パスワード
			super.add("confirmpw", new RequiredValidator(),
					new MaxLengthValidator(20),
					new RegexpValidator("[0-9a-zA-Z]+"));
			// ユーザ名
			super.add("aname", new RequiredValidator(),
					new MaxLengthValidator(40));
		}
	};

	/**
	 * トップで使用する{@link FlashMap}です。
	 */
	@Inject
	private FlashMap flashMap;

	/**
	 * ログインID
	 */
	@RequestParameter
	public String uid;

	/**
	 * パスワード
	 */
	@RequestParameter
	public String upw;

	/**
	 * 確認用パスワード
	 */
	@RequestParameter
	public String confirmpw;

	/**
	 * アカウント名
	 */
	@RequestParameter
	public String aname;

	/**
	 * この画面で使用する{@link AccountService}です。
	 */
	private AccountService accountService = Guice.createInjector(
			new HeyaModule()).getInstance(AccountService.class);

	/**
	 * 最初にアクセスされた際のアクション・メソッドです。
	 * 
	 * @return {@code /b/newaccount.jsp}
	 */
	@Accept(RequestMethod.GET)
	public ActionResult index() {
		return new Forward("/b/newaccount.jsp");
	}

	/**
	 * Entryボタンが押された際のアクション・メソッドです。
	 * 
	 * @return {@code b/index.jsp}
	 */
	@Accept(RequestMethod.POST)
	@Validation(rules = "validation", errorPage = "/b/newaccount.jsp")
	public ActionResult entry() {
		// パスワードのチェック
		if (this.upw.equals(this.confirmpw) == false) {
			this.flashMap.put("notice", "パスワードが正しく設定できていないようです。");
			return new Forward("/b/newaccount.jsp");
		}
		// 登録
		try {
			String loginId = this.uid.trim();
			String loginPw = this.upw.trim();
			String accountName = this.aname.trim();
			this.accountService.createNewAccount(new UserInfo(loginId, loginPw, accountName));
		} catch (ResourcesAlreadyExistException e) {
			// 重複チェックエラー
			this.flashMap.put("notice", "そのログインIDは既に使われているようです。");
			return new Forward("/b/newaccount.jsp");
		}
		return new Redirect("/");
	}

}
